/*
  表达式格式：
  1. 常量：
    string/number.取值
    例如：value.type
  2. 表头关联：
    head.fieldCode
    例如：head.code
  3. 表身关联： - 未处理
    body.bodyName.line.fieldCode
    例如：body.bodyName.line.fieldCode
 */

/**
 * 格式化查询表达式，用于开窗时的条件查询
 * @param vueObject     Vue对象，一般即this
 * @param data          数据
 * @param expression    表达式 {"searcher中key1":"表达式", "searcher中key2":"表达式2"}
 * @param searcher      查询器
 */
export function searchFormat(vueObject, data, expression, searcher) {
  // 遍历表达式
  for (const key in expression) {
    // 按.分割表达式
    const expressionArray = expression[key].split('.')
    if (expressionArray.length === 2 && expressionArray[0] === 'string') {
      // 如果是字符常量，格式为 string.value
      searcher[key] = expressionArray[1]
    } else if (expressionArray.length === 2 && expressionArray[0] === 'number') {
      // 如果是数值常量，格式为 number.value
      searcher[key] = Number(expressionArray[1])
    } else if (expressionArray.length === 2 && expressionArray[0] === 'head') {
      // 如果是表头映射，格式为 head.fieldCode
      searcher[key] = data.head[expressionArray[1]]
    } else if (expressionArray.length === 4 && expressionArray[0] === 'body') {
      // 如果是表身映射，格式为 body.bodyName.line.fieldCode
      const bodyName = expressionArray[1]
      const line = Number(expressionArray[2])
      const keyArray = key.split('.')

      if (keyArray.length === 1) {
        // 如果是一般表达式
        vueObject.$set(searcher, key, data.body[bodyName][line][expressionArray[3]])
      }
    }
  }
}

/**
 * 格式化取值表达式，用于开窗时的赋值
 * @param vueObject     Vue对象，一般即this
 * @param value         选中数据
 * @param expression    表达式 {"表达式":"value中key1", "表达式":"value中key2"}
 * @param data          表单数据
 */
export function valueFormat(vueObject, value, expression, data) {
  // 遍历表达式
  for (const index in expression) {
    // 按.分割表达式
    const key = expression[index]
    const expressionArray = index.split('.')

    if (expressionArray.length === 2 && expressionArray[0] === 'head') {
      // 如果是表头映射，格式为 head.fieldCode
      const keyArray = key.split('.')
      if (keyArray.length === 1) {
        // 如果是一般表达式
        vueObject.$set(data.head, expressionArray[1], value[key])
      } else if (keyArray.length === 2 && keyArray[0] === 'string') {
        // 如果是字符串常量
        vueObject.$set(data.head, expressionArray[1], keyArray[1])
      } else if (keyArray.length === 2 && keyArray[0] === 'number') {
        // 如果是数字常量
        vueObject.$set(data.head, expressionArray[1], Number(keyArray[1]))
      }
    } else if (expressionArray.length === 4 && expressionArray[0] === 'body') {
      // 如果是表身映射，格式为 body.bodyName.line.fieldCode
      const bodyName = expressionArray[1]
      const line = Number(expressionArray[2])
      const keyArray = key.split('.')
      if (keyArray.length === 1) {
        // 如果是一般表达式
        vueObject.$set(data.body[bodyName][line], expressionArray[3], value[key])
      } else if (keyArray.length === 2 && keyArray[0] === 'string') {
        // 如果是字符串常量
        vueObject.$set(data.body[bodyName][line], expressionArray[3], keyArray[1])
      } else if (keyArray.length === 2 && keyArray[0] === 'number') {
        // 如果是数字常量
        vueObject.$set(data.body[bodyName][line], expressionArray[3], Number(keyArray[1]))
      }
    }
  }
}

/**
 * 格式化取值表达式
 * @param vueObject     Vue对象，一般即this
 * @param expression    表达式 {"表达式":"value中key1", "表达式":"value中key2"}
 * @param data          表单数据
 */
export function valueClear(vueObject, expression, data) {
  // 遍历表达式
  for (const index in expression) {
    // 按.分割表达式

    const key = expression[index]
    const expressionArray = index.split('.')

    // 如果是表头映射，格式为 head.fieldCode
    if (expressionArray.length === 2 && expressionArray[0] === 'string') {
      // 如果是字符常量，格式为 string.value
      data[key] = ''
    } else if (expressionArray.length === 2 && expressionArray[0] === 'number') {
      // 如果是数值常量，格式为 number.value
      data[key] = 0
    } else if (expressionArray.length === 2 && expressionArray[0] === 'head') {
      // 赋值到searcher
      vueObject.$set(data.head, expressionArray[1], '')
    } else if (expressionArray.length === 4 && expressionArray[0] === 'body') {
      const bodyName = expressionArray[1]
      const line = Number(expressionArray[2])
      // 赋值到searcher
      vueObject.$set(data.body[bodyName][line], expressionArray[3], '')
    }
  }
}
